﻿using BaseFramework;
using LiteFramework.Enum;
using LiteFramework.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace LiteFramework.Contract
{
    public interface IPermissionContract
    {
        #region User

        /// <summary>
        /// 是否已存在用户名(包含验证登陆者本身)
        /// </summary>
        /// <param name="userName"></param>
        /// <returns></returns>
        bool ExistUserName(string userName);
        /// <summary>
        /// 是否已存在用户名
        /// </summary>
        /// <param name="userName"></param>
        /// <param name="ignoreSelf">忽略当前登陆人（即，当前用户不计数在内）</param>
        /// <returns></returns>
        bool ExistUserName(string userName, bool ignoreSelf);
        /// <summary>
        /// 是否已存在昵称(包含验证登陆者本身)
        /// </summary>
        /// <param name="nickName"></param>
        /// <returns></returns>
        bool ExistNickName(string nickName);
        /// <summary>
        /// 是否已存在昵称
        /// </summary>
        /// <param name="nickName"></param>
        /// <param name="ignoreSelf">忽略当前登陆人（即，当前用户不计数在内）</param>
        /// <returns></returns>
        bool ExistNickName(string nickName, bool ignoreSelf);
        /// <summary>
        /// 是否已存在电子邮箱(包含验证登陆者本身)
        /// </summary>
        /// <param name="email"></param>
        /// <returns></returns>
        bool ExistEmail(string email);
        /// <summary>
        /// 是否已存在电子邮箱
        /// </summary>
        /// <param name="email"></param>
        /// <param name="ignoreSelf">忽略当前登陆人（即，当前用户不计数在内）</param>
        /// <returns></returns>
        bool ExistEmail(string email, bool ignoreSelf);


        /// <summary>
        /// 获取当前登陆用户信息。
        /// <para>　　【注意】：此方法将更新用户的最后一次活动日期/时间戳！</para>
        /// </summary>
        /// <returns></returns>
        User GetUser();
        /// <summary>
        /// 通过OpenId获取用户信息
        /// </summary>
        /// <param name="type">第三方验证方式</param>
        /// <param name="openId">openId</param>
        /// <returns></returns>
        User GetUserByOpenId(LoginType type, string openId);
        /// <summary>
        /// 获取当前用户
        /// </summary>
        /// <returns></returns>
        UserNameChoice GetUser2();

        /// <summary>
        /// 获取用户
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        User GetUser(int id);
        /// <summary>
        /// 获取用户
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        UserNameChoice GetUser2(int id);
        /// <summary>
        /// 获取用户
        /// </summary>
        /// <param name="userName"></param>
        /// <returns></returns>
        User GetUser(string userName);

        /// <summary>
        /// 获取当前用户可操作的所有用户信息，包括已停用（登陆用户为研发中心用心时，将返回所有其他公司的网点信息）
        /// <para>　　*</para>
        /// <para>　　*【注意】此方法仅用于用户编辑模块，实际业务中，可能只需要返回本公司用户信息，请调用GetUserByCompany方法</para>
        /// <para>　　*</para>
        /// </summary>
        /// <returns></returns>
        User[] GetAllUsers();
        /// <summary>
        /// 获取当前用户可操作的所有用户信息（登陆用户为研发中心用心时，将返回所有其他公司的网点信息）
        /// <para>　　*</para>
        /// <para>　　*【注意】此方法仅用于用户编辑模块，实际业务中，可能只需要返回本公司用户信息，请调用GetUserByCompany方法</para>
        /// <para>　　*</para>
        /// </summary>
        /// <param name="onlyActive">只包括已启用项</param>
        /// <returns></returns>
        User[] GetAllUsers(YesNoUnsure onlyActive);
        /// <summary>
        /// 获取当前用户可操作的所有用户信息（登陆用户为研发中心用心时，将同时返回其他公司的所有网点信息）
        /// <para>　　*</para>
        /// <para>　　*【注意】此方法仅用于用户编辑模块，实际业务中，可能只需要返回本公司用户信息，请调用GetUserByCompany方法</para>
        /// <para>　　*</para>
        /// </summary>
        /// <param name="companyID">指定网点</param>
        /// <param name="onlyActive">只包括已启用项</param>
        /// <returns></returns>
        User[] GetAllUsers(Guid companyID, YesNoUnsure onlyActive);
        /// <summary>
        /// 获取当前用户可操作的所有用户信息（登陆用户为研发中心用心时，将同时返回其他公司的所有网点信息）
        /// <para>　　*</para>
        /// <para>　　*【注意】此方法仅用于用户编辑模块，实际业务中，可能只需要返回本公司用户信息，请调用GetUserByCompany方法</para>
        /// <para>　　*</para>
        /// </summary>
        /// <param name="searchParam">搜索参数</param>
        /// <param name="pageParam">分页参数</param>
        /// <param name="onlyActive">只包括已启用项</param>
        /// <returns></returns>
        User[] GetAllUsers(SearchParam searchParam, ref PageParam pageParam, YesNoUnsure onlyActive);
        /// <summary>
        /// 获取当前用户可操作的所有用户信息（登陆用户为研发中心用心时，将返回所有其他公司的网点信息）
        /// <para>　　*</para>
        /// <para>　　*【注意】此方法仅用于用户编辑模块，实际业务中，可能只需要返回本公司用户信息，请调用GetUserByCompany方法</para>
        /// <para>　　*</para>
        /// </summary>
        /// <param name="onlyActive">只包括已启用项</param>
        /// <returns></returns>
        UserNameChoice[] GetAllUsers2(YesNoUnsure onlyActive);
        /// <summary>
        /// 获取当前用户可操作的所有用户信息（登陆用户为研发中心用心时，将同时返回其他公司的所有网点信息）
        /// <para>　　*</para>
        /// <para>　　*【注意】此方法仅用于用户编辑模块，实际业务中，可能只需要返回本公司用户信息，请调用GetUserByCompany方法</para>
        /// <para>　　*</para>
        /// </summary>
        /// <param name="companyID">指定网点</param>
        /// <param name="onlyActive">只包括已启用项</param>
        /// <returns></returns>
        UserNameChoice[] GetAllUsers2(Guid companyID, YesNoUnsure onlyActive);
        /// <summary>
        /// 获取当前用户可操作的所有用户信息（登陆用户为研发中心用心时，将同时返回其他公司的所有网点信息）
        /// <para>　　*</para>
        /// <para>　　*【注意】此方法仅用于用户编辑模块，实际业务中，可能只需要返回本公司用户信息，请调用GetUserByCompany方法</para>
        /// <para>　　*</para>
        /// </summary>
        /// <param name="searchParam">搜索参数</param>
        /// <param name="pageParam">分页参数</param>
        /// <param name="onlyActive">只包括已启用项</param>
        /// <returns></returns>
        UserNameChoice[] GetAllUsers2(SearchParam searchParam, ref PageParam pageParam, YesNoUnsure onlyActive);

        #region GetUserByCompany

        /// <summary>
        /// 获取当前登陆用户所在公司的所有用户
        /// </summary>
        /// <param name="onlyActive">只包括已启用项</param>
        /// <returns></returns>
        UserNameChoice[] GetUserByCompany(bool onlyActive);
        /// <summary>
        /// 获取指定公司的所有用户
        /// </summary>
        /// <param name="company">指定的公司</param>
        /// <param name="onlyActive">只包括已启用项</param>
        /// <returns></returns>
        UserNameChoice[] GetUserByCompany(Company company, bool onlyActive);
        /// <summary>
        /// 获取指定公司的所有用户
        /// </summary>
        /// <param name="companyID">指定的公司ID</param>
        /// <param name="onlyActive">只包括已启用项</param>
        /// <returns></returns>
        UserNameChoice[] GetUserByCompany(Guid companyID, bool onlyActive);

        #endregion

        /// <summary>
        /// 获取指定机构的用户
        /// </summary>
        /// <param name="organization">机构</param>
        /// <param name="includeSub">是否包括子机构的用户</param>
        /// <param name="searchParam">搜索参数</param>
        /// <param name="pageParam">分页参数</param>
        /// <returns></returns>
        User[] GetUser(OrganizationNameChoice organization, bool includeSub, SearchParam searchParam, ref PageParam pageParam);
        /// <summary>
        /// 获取指定机构中属于指定角色的用户
        /// </summary>
        /// <param name="organization">机构</param>
        /// <param name="includeSub">是否包括子机构的用户</param>
        /// <param name="roleCodes">角色</param>
        /// <param name="searchParam">搜索参数</param>
        /// <param name="pageParam">分页参数</param>
        /// <returns></returns>
        User[] GetUserWithRole(OrganizationNameChoice organization, bool includeSub, string[] roleCodes, SearchParam searchParam, ref PageParam pageParam);
        /// <summary>
        /// 获取指定机构中具有指定权限的用户
        /// </summary>
        /// <param name="organization">机构</param>
        /// <param name="includeSub">是否包括子机构的用户</param>
        /// <param name="taskCodes">权限</param>
        /// <param name="searchParam">搜索参数</param>
        /// <param name="pageParam">分页参数</param>
        /// <returns></returns>
        User[] GetUserWithTask(OrganizationNameChoice organization, bool includeSub, string[] taskCodes, SearchParam searchParam, ref PageParam pageParam);

        /// <summary>
        /// 保存用户信息
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        int SaveUser(User user);
        /// <summary>
        /// 删除用户信息
        /// </summary>
        /// <param name="user"></param>
        bool RemoveUser(User user);
        /// <summary>
        /// 删除用户信息
        /// </summary>
        /// <param name="ids"></param>
        int RemoveUser(params int[] ids);
        /// <summary>
        /// 获取默认电子邮箱地址
        /// </summary>
        /// <returns></returns>
        string GetDefaultEmailSuffix();
        /// <summary>
        /// 启用/禁用
        /// </summary>
        /// <param name="active"></param>
        /// <param name="user"></param>
        bool ActiveUser(bool active, User user);
        /// <summary>
        /// 启用/禁用
        /// </summary>
        /// <param name="active"></param>
        /// <param name="ids"></param>
        int ActiveUser(bool active, params int[] ids);
        /// <summary>
        /// 解锁用户
        /// </summary>
        /// <param name="user"></param>
        bool UnlockUser(User user);
        /// <summary>
        /// 解除用户
        /// </summary>
        /// <param name="ids"></param>
        int UnlockUser(params int[] ids);

        #endregion

        #region Password

        /// <summary>
        /// 判断是否安全的密码
        /// </summary>
        /// <param name="password"></param>
        /// <returns></returns>
        bool IsSecurePassword(string password);
        /// <summary>
        /// 验证密码
        /// </summary>
        /// <param name="password"></param>
        /// <returns></returns>
        bool Validate(string password);

        /// <summary>
        /// 重置密码
        /// </summary>
        /// <param name="user"></param>
        /// <param name="state"></param>
        void ResetPassword(object state, User user);
        /// <summary>
        /// 重置密码
        /// </summary>
        /// <param name="state"></param>
        /// <param name="ids"></param>
        void ResetPassword(object state, params  int[] ids);

        /// <summary>
        /// 修改密码
        /// </summary>
        /// <param name="oldPassword"></param>
        /// <param name="newPassword"></param>
        void ChangePassword(string oldPassword, string newPassword);
        /// <summary>
        /// 修改安全证书
        /// </summary>
        /// <param name="user"></param>
        /// <param name="newPin"></param>
        void ChangePIN(User[] user, string newPin);

        #endregion

        #region Role
        /// <summary>
        /// 获取所有角色
        /// </summary>
        /// <returns></returns>
        Role[] GetAllRoles();
        /// <summary>
        /// 获取默认角色(注册用户的默认权限：role.Name=默认)
        /// </summary>
        /// <returns></returns>
        Role GetDefaultRole();
        /// <summary>
        /// 获取角色
        /// </summary>
        /// <param name="id">角色ID</param>
        /// <returns></returns>
        Role GetRole(Guid id);
        /// <summary>
        /// 获取角色
        /// </summary>
        /// <param name="roleName">角色名称</param>
        /// <returns></returns>
        Role GetRole(string roleName);
        /// <summary>
        /// 保存角色
        /// </summary>
        /// <param name="role"></param>
        /// <returns></returns>
        Guid SaveRole(Role role);
        /// <summary>
        /// 删除角色
        /// </summary>
        /// <param name="role"></param>
        void RemoveRole(Role role);
        /// <summary>
        /// 删除角色
        /// </summary>
        /// <param name="ids"></param>
        void RemoveRole(params Guid[] ids);
        #endregion

        #region Task
        /// <summary>
        /// 获取所有权限
        /// </summary>
        /// <returns></returns>
        Model.Task[] GetAllTasks();
        /// <summary>
        /// 获取权限
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        Model.Task GetTask(Guid id);
        /// <summary>
        /// 获取权限名称
        /// </summary>
        /// <param name="taskCode"></param>
        /// <returns></returns>
        string GetTaskName(string taskCode);
        #endregion
    }
}